package com.atguigu.distributed.lock.leecode;

/**
 * 约瑟夫环：
 * 15 个基督教徒和 15 个非教徒在海上遇险，必须将其中一半的人投入海中，其余
 * 的人才能幸免于难，于是 30 个人围成 一圈，从某一个人开始从 1 报数，报到 9
 * 的人就扔进大海，他后面的人继续从 1 开始报数，重复上面的规则，直到剩下 15
 * 个人为止。结果由于上帝的保佑，15 个基督教徒最后都幸免于难，问原来这些
 * 人是怎么排列的，哪些位置是基督 教徒，哪些位置是非教徒。
 */
public class JosefCircle {
    private static final int DEAD_NUM = 9;

    public static void main(String[] args) {
        boolean[] persons = new boolean[30];
        for (int i = 0; i < persons.length; i++) {
            persons[i] = true;
        }
        int counter = 0;
        int claimNumber = 0;
        int index = 0;
        while (counter < 15) {
            if(persons[index]){
                claimNumber++;
                if(claimNumber==DEAD_NUM){
                    counter++;
                    claimNumber=0;
                    persons[index] = false;
                }
            }

            index++;
            if(index>=persons.length){
                index=0;
            }
        }
        for(boolean p:persons){
            if(p){
                System.out.println("基督教");
            }else {
                System.out.println("非基督教徒");
            }
        }

    }
    public void main2(){
        boolean[] persons = new boolean[30];
        for (int i = 0; i < persons.length; i++) {
            persons[i] = true;
        }
        int counter = 0;
        int claimNumber = 0;
        int index = 0;
        while (counter<15){
            if(persons[index]){
                claimNumber++;
                if(claimNumber==DEAD_NUM){
                    counter++;
                    claimNumber=0;
                    persons[index] = false;
                }
            }
            index++;
            if(index>=persons.length){
                index=0;
            }
        }

    }
}
